<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script type="module">
	// 1- Promise是一个构造函数，接收一个回调函数（执行器函数）会被同步调用
	// import Promise from "./module/Promise.js";
	// new Promise(function(num){
	// 	console.log("over",num);
	// })
	// console.log(1);
	
	// 2- Promise对应的执行器函数接收两个参数，类型均是函数
	// import Promise from "./module/Promise.js";
	// new Promise(function(resolve,reject){
	// 	console.log(resolve,reject)
	// })
	
	// 3- Promise的实例属性有两个：状态（成功fulfilled，失败rejected,初始值pending），值(初始值undefined)
	// import Promise from "./module/Promise.js";
	// const result = new Promise(function(){
	// })
	// console.log(result);
	
	// 4- 状态可以进行更改，更改有三种方式：
	// 4-1- 调用resolve将状态由pendng更改为fulfilled,接收的值即是成功值
	// 4-2- 调用reject将状态由pendng更改为rejected,接收的值即是失败值
	// 4-3- 抛出异常将状态由pendng更改为rejected,抛出的异常值即是失败值
	// 4-4- 状态只允许被更改一次：
	//      pending--->fulfilled
	//      pending--->rejected
	// import Promise from "./module/Promise.js";
	// const result = new Promise(function(resolve,reject){
	// 	// resolve(1);
	// 	// reject(100);
	// 	let a = 1;
	// 	a();
	// })
	// console.log(result);
	
	// 5- Promise.prototype.then方法:
	// 5-1- 如果p的状态为成功then执行成功回调，接收的值是成功值
	// 5-2- 如果p的状态为失败then执行失败回调，接收的值是失败值
	// import Promise from "./module/Promise.js";
	// const p = new Promise(function(resolve,reject){
	// 	resolve(100);
	// 	// reject(200)
	// })
	// p.then(function(value){
	// 	console.log("成功回调",value);
	// },function(reason){
	// 	console.log("失败回调",reason);
	// })
	
	// 5-3- then函数返回的是Promise实例,实例的状态以及值受成功或失败回调函数的返回值影响：
	// 如果返回的是一个非Promise实例，那么状态为成功，成功值为返回值
	// 如果返回的是一个Promise实例，那么状态以及值与返回Promise实例状态以及值相同。
	// 如果有异常，那么状态为失败，值为异常信息。
	// import Promise from "./module/Promise.js";
	// const p = new Promise(function(resolve,reject){
	// 	resolve(100);
	// 	// reject(200)
	// })
	// const p1 = p.then(value=>{
	// 	console.log("成功回调",value);
	// 	// return 1;
	// 	// return new Promise((resolve,reject)=>{
	// 	// 	reject(20);
	// 	// })
	//
	// 	// throw "异常1";
	// },reason=>{
	// 	// console.log("失败回调",reason);
	// 	// return new Promise((resolve,reject)=>{
	// 	// 	resolve(20);
	// 	// });
	// 	throw "异常2";
	// })
	// console.log(p1);
	
	// 5-4- 当省略成功回调时:成功回调默认为value=>value
	// 5-5- 当省略失败回调时:失败回调默认为reason=>{throw reason}
	// import Promise from "./module/Promise.js";
	// const p = new Promise(function(resolve,reject){
	// 	resolve(100);
	// })
	// const p2 = p.then();
	// console.log(p2);
	
	// 5-6- then指定的成功与失败回调函数可以执行多次。
	// 5-7- 先指定回调函数再更改状态。
	// import Promise from "./module/Promise.js";
	// const p = new Promise((resolve)=>{
	// 	setTimeout(()=>{
	// 		resolve(100);
	// 	},1000)
	//
	// })
	// p.then(value=>{
	// 	console.log(value);
	// })
	// p.then(value=>{
	// 	console.log(value);
	// })
	// p.then(value=>{
	// 	console.log(value);
	// })
	// p.then(value=>{
	// 	console.log(value);
	// })
	
	// 6- 异常穿透
	// import Promise from "./module/Promise.js";
	//
	// new Promise(function(resolve){
	// 	resolve(1);
	// }).then(value=>{
	// 	console.log(value);// 1
	// 	return value+1;
	// }).then(value=>{
	// 	console.log(value);// 2
	// 	throw value+2;
	// }).then(value=>{
	// 	console.log(value);// 4
	// 	return value+ 4;
	// }).then(value=>{
	// 	console.log(value);// 8
	// }).catch(err=>{
	// 	console.log("catch",err);
	// })
	
	// 7- 中断Promise
	import Promise from "./module/Promise.js";
	
	new Promise(function(resolve){
		resolve(1);
	}).then(value=>{
		console.log(value);// 1
		return value+1;
	}).then(value=>{
		console.log(value);// 2
		return new Promise(()=>{})
	}).then(value=>{
		console.log(value);// 4
		return value+ 4;
	}).then(value=>{
		console.log(value);// 8
	}).catch(err=>{
		console.log("catch",err);
	})
	
	
	
	
	
	// const p = new Promise((resolve,reject)=>{
	// 	reject(100);
	// })
	// p.then(undefined,reason=>{
	// 	console.log("失败回调",reason)
	// })
	// const p1 = p.catch(reason=>{
	// 	console.log("失败回调",reason)
	// })
	// console.log(p1);
	
</script>
</html>